home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Graphics / Icons / next-icon@gun.com / Apps / ImagePortfolio / ExpandedView.cxx < prev    next >
Text File  |  1993-06-03  |  6KB  |  209 lines

  1. // -------------------------------------------------------------------------------------
  2. // ExpandedView.cxx
  3. // -------------------------------------------------------------------------------------
  4. // Permission is granted to freely redistribute this source code, and to use fragments
  5. // of this code in your own applications if you find them to be useful.  This class,
  6. // along with the source code, come with no warranty of any kind, and the user assumes
  7. // all responsibility for its use.
  8. // -------------------------------------------------------------------------------------
  9.  
  10. extern "Objective-C" {
  11. #import <objc/objc.h>
  12. #import <appkit/appkit.h>
  13. #import <libc.h>
  14. #import <stdlib.h>
  15. #import <stdio.h>
  16. #import <string.h>
  17. #import <math.h>
  18. #import <sys/time.h>
  19. #import <defaults/defaults.h>
  20. #import <dpsclient/psops.h>
  21. #import <dpsclient/dpsNeXT.h>
  22. }
  23.  
  24. #import "ExpandedView.h"
  25.  
  26. // -------------------------------------------------------------------------------------
  27. // misc defines
  28. #define    isSHIFT(S)            ((([NXApp currentEvent]->flags) & (S))? YES : NO)
  29. #define    X                    origin.x
  30. #define    Y                    origin.y
  31. #define    W                    size.width
  32. #define    H                    size.height
  33.  
  34. // -------------------------------------------------------------------------------------
  35. // PasteBoard dragging operation variables
  36. extern NXAtom                pbTypes[];
  37. extern int                    pbNumTypes;
  38. extern int                    pbChangeCount;
  39.  
  40. // -------------------------------------------------------------------------------------
  41. @implementation ExpandedView
  42.  
  43. // -------------------------------------------------------------------------------------
  44. // create a new instance
  45.  
  46. /* standard init */
  47. - initFrame:(const NXRect *)frameRect
  48. {
  49.     [super initFrame:frameRect];
  50.     imageId = (id)nil;
  51.     return self;
  52. }
  53.  
  54. // -------------------------------------------------------------------------------------
  55. // image methods
  56.  
  57. /* set image */
  58. - setImage:image :(const char*)fileName
  59. {
  60.     NXRect    vFrame;
  61.   
  62.     /* check for valid image representation */
  63.     imageId = (id)nil;
  64.     imageFile = (char*)nil;
  65.     if (!image) return (id)nil;
  66.     if (![[image representationList] count]) return (id)nil;
  67.     imageId = image;
  68.     imageFile = fileName;
  69.   
  70.     /* resize view to match image */
  71.     [imageId getSize:&(vFrame.size)];
  72.     [self sizeTo:vFrame.W :vFrame.H];
  73.     drawWithAlpha = YES;
  74.     backgroundGray = NX_LTGRAY;
  75.     imageRep = -1;
  76.  
  77.     /* find best rep */
  78.     bestRep = [[image representationList] indexOf:[imageId bestRepresentation]];
  79.     
  80.     return self;
  81. }
  82.  
  83. /* return image */
  84. - image
  85. {
  86.     return imageId;
  87. }
  88.  
  89. /* return alpha status */
  90. - (BOOL)imageRepHasAlpha:(int)repNum
  91. {
  92.     if (!imageId || (repNum < 0)) return NO;
  93.     return [[[imageId representationList] objectAt:repNum] hasAlpha];
  94. }
  95.  
  96. - (int)bestRepIndex
  97. {
  98.     return bestRep;
  99. }
  100.  
  101. /* set which imageRep to display */
  102. - setImageRep:(int)repNum withAlpha:(BOOL)useAlpha
  103. {
  104.     if (!imageId) return (id)nil;
  105.     if ((imageRep != repNum) || (drawWithAlpha != useAlpha)) {
  106.         id repId;
  107.         if (imageRep < 0) {
  108.             repId = [imageId bestRepresentation];
  109.             imageRep = [[imageId representationList] indexOf:repId];
  110.         } else {
  111.             repId = [[imageId representationList] objectAt:repNum];
  112.             imageRep = repNum;
  113.         }
  114.         if (!repId) return (id)nil;
  115.         backgroundGray = ([repId isKindOf:[NXEPSImageRep class]])? NX_WHITE : NX_LTGRAY;
  116.         drawWithAlpha = useAlpha;
  117.     }
  118.     return self;
  119. }
  120.  
  121. // -------------------------------------------------------------------------------------
  122. // draw methods
  123.  
  124. /* draw self */
  125. - drawSelf:(const NXRect *)r :(int)c
  126. {
  127.     NXRect rect;
  128.  
  129.     /* draw background */
  130.     PSsetgray((imageId)?backgroundGray:NX_LTGRAY);
  131.     NXRectFill(&bounds);
  132.     if (!imageId) return self;
  133.  
  134.     /* center image */
  135.     [imageId getSize:&rect.size];
  136.     rect.X = floor((bounds.W - rect.W) / 2.0);
  137.     rect.Y = floor((bounds.H - rect.H) / 2.0);
  138.     
  139.     /* get representation to draw */
  140.     if (imageRep < 0) [self setImageRep:-1 withAlpha:YES];
  141.     id rep = [[imageId representationList] objectAt:imageRep];
  142.     
  143.     /* draw image */
  144.     if (drawWithAlpha && (NXDrawingStatus == NX_DRAWING)) {
  145.         id tempImage = [[NXImage alloc] initSize:&rect.size];
  146.         [tempImage setFlipped:[imageId isFlipped]];
  147.         PSgsave();
  148.         if ([tempImage lockFocus]) {
  149.             NXRect r = rect;
  150.             r.X = r.Y = 0.0;
  151.             [rep drawIn:&r];
  152.             [tempImage unlockFocus];
  153.         }
  154.         PSgrestore();
  155.         [tempImage composite:NX_SOVER toPoint:&rect.origin];
  156.         [tempImage free];
  157.     } else {
  158.         [rep drawIn:&rect];
  159.     }
  160.     
  161.     return self;
  162. }
  163.  
  164. // -------------------------------------------------------------------------------------
  165. // mouse down
  166.  
  167. /* mouse down events */
  168. - mouseDown:(NXEvent*)e
  169. {
  170.     NXEvent eventCopy = *e;
  171.     NXPoint    mousePt = e->location;
  172.     
  173.     /* check for no image */
  174.     if (!imageId) return self;
  175.  
  176.     /* set up image dragging */
  177.     NXRect rect;
  178.     [imageId getSize:&rect.size];
  179.     rect.X = floor((bounds.W - rect.W) / 2.0);
  180.     rect.Y = floor((bounds.H - rect.H) / 2.0);
  181.     [self convertPoint:&mousePt fromView:(id)nil];
  182.     if ((rect.X > 0.0) && (rect.Y > 0.0) && [self mouse:&mousePt inRect:&rect]) {
  183.         NXPoint offset = { 0.0, 0.0 };
  184.         Pasteboard *pboard = [Pasteboard newName:NXDragPboard];    // do not free
  185.         if (imageFile && isSHIFT(NX_ALTERNATEMASK)) {
  186.             [pboard declareTypes:pbTypes num:pbNumTypes owner:(id)nil];
  187.             [pboard writeType:pbTypes[0] data:imageFile length:strlen(imageFile) + 1];
  188.         } else {
  189.             NXAtom dummyType[] = { "_nilType" };
  190.             [pboard declareTypes:dummyType num:1 owner:(id)nil];
  191.             [pboard writeType:dummyType[0] data:"" length:1];
  192.         }
  193.         [self dragImage:imageId at:&(rect.origin) offset:&offset event:&eventCopy 
  194.             pasteboard:pboard source:self slideBack:YES];
  195.     } else NXBeep();
  196.  
  197.     return self;
  198.     
  199. }
  200.  
  201. /* dragging methods */
  202. - (NXDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
  203. {
  204.     if (isLocal || !imageFile) return NX_DragOperationNone;
  205.     return NX_DragOperationGeneric | NX_DragOperationCopy;
  206. }
  207.  
  208. @end
  209.